﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OWLServer.owl.tipos
{
    /// <summary>
    /// Clase que representa una propiedad de objeto asignada a un individuo en una ontología.
    /// </summary>
    public class PropiedadObjetoIndividuo : PropiedadIndividuo, IEquatable<PropiedadObjetoIndividuo>
    {
        private PropiedadObjeto propiedadObjeto;
        private Individuo individuo;

        /// <summary>
        /// Propiedad del Objeto
        /// </summary>
        public virtual PropiedadObjeto PropiedadObjeto
        {
            get { return propiedadObjeto; }
            set { propiedadObjeto = value; }
        }

        /// <summary>
        /// Individuo con en el que se vincula la propiedad
        /// </summary>
        public virtual Individuo Individuo
        {
            get { return individuo; }
            set { individuo = value; }
        }

        public PropiedadObjetoIndividuo() { }

        public PropiedadObjetoIndividuo(Individuo individuo, PropiedadObjeto propiedad)
        {
            Individuo = individuo;
            PropiedadObjeto = propiedad;
        }

        public PropiedadObjetoIndividuo(Individuo individuo, PropiedadObjeto propiedad, bool negada)
            : base(negada)
        {
            Individuo = individuo;
            PropiedadObjeto = propiedad;
        }

        /// <summary>
        /// Método ToString()
        /// </summary>
        /// <returns></returns>
        override public String ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(this.PropiedadObjeto);
            sb.Append(": ");
            sb.Append(this.Individuo);
            if (Negada)
            {
                sb.Append(" (NEGADA)");
            }

            return sb.ToString();
        }

        #region Miembros de IEquatable<PropiedadObjetoIndividuo>

        public bool Equals(PropiedadObjetoIndividuo other)
        {
            return Individuo.Equals(other.Individuo) && PropiedadObjeto.Equals(other.PropiedadObjeto);
        }

        #endregion
    }
}
